/*
* @Author: wanli
* @Date: 2021-02-Mo 05:57:12
* @Last Modified by:   wanli
* @Last Modified time: 2021-02-Mo 05:57:12
*/

#include <tvm/tvm_file.h>

// 打卡一个文件
// 参数：
// 文件名
// 文件扩展名
// 打开模式
FILE *tvm_fopen(const char *filename, const char *extension, const char *mode)
{
    FILE *filp = NULL;
    size_t fname_chars = strlen(filename) + strlen(extension) + 1; // 拼接文件名
    char *fname = calloc(fname_chars, sizeof(char));               // 为文件名申请空间
    int i;

    strcpy(fname, filename); // 拷贝文件名到filename指针空间中

    for (i = 0; i < 2 && !filp; i++)
    {
        if (i > 0)
            strcat(fname, extension);
        filp = fopen(fname, mode);
    }

    free(fname);
    return filp;
}

// 拷贝文件
// dest为要拷贝到的目标地址
// size为要拷贝的大小
// filp文件句柄
// 文件相应内容拷贝完成后，复位到初始位置
int tvm_fcopy(char *dest, size_t size, FILE *filp)
{
    size_t i;
    long pos = ftell(filp); // 获取当前文件指针

    for (i = 0; i < size && !feof(filp); i++)
        dest[i] = fgetc(filp); // 获取一个字符
    dest[i - 1] = 0;           // 最后一位置空，表示结束

    fseek(filp, pos, SEEK_SET); // 复位文件指针
    // SEEK_SET 文件开头
    // SEEK_CUR 文件指针的当前位置
    // SEEK_END 文件末尾

    return 0;
}

// 获取当前文件指针到文件结尾处的长度
int tvm_flength(FILE *filp)
{
    int length;
    long pos = ftell(filp); // 获取当前文件指针

    for (length = 0; !feof(filp); length++)
        fgetc(filp);
    fseek(filp, pos, SEEK_SET); // 复位文件指针

    return length;
}
